package org.zjt.spring.setfiled;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2017/4/12.
 */
public class InvokerInvocationHandler implements InvocationHandler {

    private final MethodResult<?> invoker;

    public InvokerInvocationHandler(MethodResult<?> handler){
        this.invoker = handler;
    }


    /** method:调用的方法名   proxy:被代理的对象  args：调用方法传递来的参数*/
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        /** method:调用的方法名   proxy:被代理的对象  args：调用方法传递来的参数*/

        String methodName = method.getName();
        Class<?>[] parameterTypes = method.getParameterTypes();
        if (method.getDeclaringClass() == Object.class) {
            return method.invoke(invoker, args);
        }
        if ("toString".equals(methodName) && parameterTypes.length == 0) {
            return invoker.toString();
        }
        if ("hashCode".equals(methodName) && parameterTypes.length == 0) {
            return invoker.hashCode();
        }
        if ("equals".equals(methodName) && parameterTypes.length == 1) {
            return invoker.equals(args[0]);
        }


        /** 执行远程调用： return invoker.invoke(new RpcInvocation(method, args)).recreate(); */

        return null ;
    }

}
